springboot阿里云视频点播服务实现上传视频和删除功能

您所在的位置:网站首页 springboot 播放视频 springboot阿里云视频点播服务实现上传视频和删除功能

springboot阿里云视频点播服务实现上传视频和删除功能

2024-01-27 12:49| 来源: 网络整理| 查看: 265

2、开通视频点播(选择按使用流量计费)

我的已经开通了,没开通的开通一下

3、选择按使用流量计费(选择使用流量计费,目前少于50G不收费,具体以实际为准)

 

4、资费说明

地址:https://www.aliyun.com/price/product?spm=a2c4g.11186623.2.12.7fbd59b9vmXVN6#/vod/detail

5、整体流程

用户获取上传授权。 VoD下发 上传地址和凭证 及 VideoId。 用户上传视频保存视频ID(VideoId)。 用户服务端获取播放凭证。 VoD下发带时效的播放凭证。 用户服务端将播放凭证下发给客户端完成视频播放。 二、视频点播服务的基本使用

参考地址:https://help.aliyun.com/product/29932.html?spm=a2c4g.11186623.6.540.3c356a58OEmVZJ

1、设置转码格式 选择全局设置 > 转码设置,单击添加转码模板组。 在视频转码模板组页面,根据业务需求选择封装格式和清晰度。 或直接将已有的模板设置为默认即可

 

2、分类管理 选择全局设置 > 分类管理 3、上传视频文件 选择媒资库 > 音视频,单击上传音视频 4、配置域名,之前视频播放必须配置域名,现在可以不配置,但是播放加密的视频,必须要域名。 音视频上传完成后,必须配一个已备案的域名,并完成CNAME绑定

 

5、视频上传只有用到基础信息中的ID值

三、视频上传文档资料

地址:https://www.aliyun.com/product/vod?spm=5176.19720258.J_8058803260.342.73832c4aJtohbh

参考上边地址里的服务端API和服务端SDK,阿里云推荐使用服务端SDK调用API.SDK的底层是API,本文主要参考服务端ADK->JAVA SDK.

API:阿里云提供固定的地址,只需要调用这个固定的地址,向地址传递参数,实现功能

SDK:调用阿里云提供类或者接口的方法实现功能

服务端:指的是java接口

客户端:指的是浏览器,安卓,ios

1、环境准备

适用于JDK 6及以上版本。

2、安装SDK

本例中用到的版本以及jar包。(注意本文用到的jar包是VODUploadDemo-java-1.4.11jar,有些jar包未开源,在maven中央仓库没有未开源的jar包,所以pom文件里不能自动联网下载,可以通过maven命令手动安装本地maven仓库中。)

可以参照这个地址:https://www.cnblogs.com/konglxblog/p/14881649.html

service com.stu 0.0.1-SNAPSHOT 4.0.0 service-vod com.aliyun aliyun-java-sdk-core com.aliyun.oss aliyun-sdk-oss com.aliyun aliyun-java-sdk-vod com.aliyun aliyun-sdk-vod-upload com.alibaba fastjson org.json json com.google.code.gson gson joda-time joda-time

版本号

1.8 0.0.1-SNAPSHOT 3.0.5 2.0 2.7.0 2.8.3 2.10.1 3.17 1.3.1 2.6 4.5.1 0.7.0 4.3.3 3.1.0 2.15.5 1.4.11 1.4.11 1.2.28 2.8.2 20170516 1.7 1.1.0 zx 0.2.2.RELEASE 3、前提条件 确认已注册阿里云账号,完成实名认证,并开通视频点播服务。 准备好访问点播服务使用的Access Key。可以在阿里云Access Key管理创建主账号Access Key,也可以在RAM访问控制台创建RAM用户,并授予VOD权限后进行相应操作,请参见创建RAM用户并授权。  4、初始化(本文以填入账号AccessKey信息,进行初始化)

点播服务的接入区域请参见接入区域和标识,例如:接入区域在上海,请使用cn-shanghai。(注意cn-shanghai是固定的。)

获取视频播放地址

获取视频播放凭证

视频功能主要根据视频的ID来实现功能,不根据视频地址实现,原因上传的视频可以加密,不加密的视频根据视频地址可以播放,但是加密地址的视频播放不了,所以根据ID实现功能,往数据库存储的是视频ID。 根据播放地址和凭证播放视频的区别,获取视频播放地址和获取视频播放凭证都可以播放视频,但是用凭证既能播放加密视频也能播放不加密的视频,而根据地址只能播放不加密的视频。 本文说的视频ID就是下图中的ID。

5、根据视频ID获取视频地址,获取视频凭证,上传视频代码示例

InitAcsClint初始化类(参照阿里云JAVA SDK ->初始化->填入账号AccessKey信息,进行初始化)

参考地址:https://help.aliyun.com/document_detail/61062.html?spm=a2c4g.11186623.6.1033.5c3f5186TnVPYE

package com.stu.vod.test; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; public class InitAcsClint { public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException { String regionId = "cn-shanghai"; // 点播服务接入区域,固定的 DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return client; } }

TestVod测试类,根据视频ID获取视频地址,获取视频凭证,上传视频方法(参照阿里云JAVA SDK->获取视频播放地址和获取视频播放凭证,上传SDK->服务端上传->JAAV上传SDK)

视频地址和视频凭证参考地址:https://help.aliyun.com/document_detail/61064.html?spm=a2c4g.11186623.2.20.322fd418dScXpy

视频上传参考地址:https://help.aliyun.com/document_detail/53406.html?spm=a2c4g.11186623.6.1025.3562d418A5I6t0

package com.stu.vod.test; import com.aliyun.vod.upload.impl.UploadVideoImpl; import com.aliyun.vod.upload.req.UploadVideoRequest; import com.aliyun.vod.upload.resp.UploadVideoResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.vod.model.v20170321.GetPlayInfoRequest; import com.aliyuncs.vod.model.v20170321.GetPlayInfoResponse; import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthRequest; import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse; import java.util.List; public class TestVod { public static void main(String[] args) throws Exception { testUploadVideo(); } /** * 本地文件上传接口 * */ private static void testUploadVideo() { String accessKeyId ="xxxxxxxQWzbRYStXv"; String accessKeySecret = "xxxxx7gc6i"; //视频标题(必选) String title = "3 - How Does Project Submission Work - upload by sdk"; //本地文件上传和文件流上传时,文件名称为上传文件绝对路径,如:/User/sample/文件名称.mp4 (必选) //文件名必须包含扩展名 String fileName = "F:/aa.mp4"; //本地文件上传 UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName); /* 可指定分片上传时每个分片的大小,默认为2M字节 */ request.setPartSize(2 * 1024 * 1024L); /* 可指定分片上传时的并发线程数,默认为1,(注:该配置会占用服务器CPU资源,需根据服务器情况指定)*/ request.setTaskNum(1); UploadVideoImpl uploader = new UploadVideoImpl(); UploadVideoResponse response = uploader.uploadVideo(request); System.out.print("RequestId=" + response.getRequestId() + "\n"); //请求视频点播服务的请求ID if (response.isSuccess()) { System.out.print("VideoId=" + response.getVideoId() + "\n"); } else { /* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */ System.out.print("VideoId=" + response.getVideoId() + "\n"); System.out.print("ErrorCode=" + response.getCode() + "\n"); System.out.print("ErrorMessage=" + response.getMessage() + "\n"); } } public static void getPlayAuth() throws Exception { //1根据视频id获取视频播放凭证 //1.1创建初始化对象 DefaultAcsClient client = InitAcsClint.initVodClient("ddddddQWzbRYStXv","xxxxxxxx9GRqdWDns17gc6i"); //1.2创建获取视频地址response和request对象 GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest(); GetVideoPlayAuthResponse response = new GetVideoPlayAuthResponse(); //1.3向request对象里面设置视频id request.setVideoId("0aff5247d80d4ff1bbddcfc6a5c8e6a1"); //1.4调用初始化对象里的方法,取得凭证 response = client.getAcsResponse(request); System.out.println(response.getPlayAuth()); } public static void getPlayUrl() throws Exception { //1根据视频id获取视频播放地址 //1.1创建初始化对象 DefaultAcsClient client = InitAcsClint.initVodClient("ddddddQWzbRYStXv","xxxxxxxx9GRqdWDns17gc6i"); //1.2创建获取视频地址response和request对象 GetPlayInfoRequest request = new GetPlayInfoRequest(); GetPlayInfoResponse response = new GetPlayInfoResponse(); //1.3向request对象里面设置视频id request.setVideoId("0aff5247d80d4ff1bbddcfc6a5c8e6a1"); //1.4调用初始化对象里的方法,传递request,获取数据 response = client.getAcsResponse(request); List playInfoList = response.getPlayInfoList(); //1.5播放地址 for (GetPlayInfoResponse.PlayInfo playInfo : playInfoList) { System.out.print("PlayInfo.PlayURL = " + playInfo.getPlayURL() + "\n"); } //Base信息 System.out.print("VideoBase.Title = " + response.getVideoBase().getTitle() + "\n"); } } 6、JAVA上传SDK示例代码(比5里的更详细,可以理解为5的扩充)

首先在地址:https://help.aliyun.com/document_detail/53406.html下载SDK。

然后解压,找到上传demo类,例子中有多种上传方式,上边通过【本地文件上传接口】方式实现上传。

四、视频上传,删除视频功能实现(通过【流式上传接口】实现视频上传)

视频删除参考地址:https://help.aliyun.com/document_detail/61065.html?spm=a2c4g.11186623.6.831.654b3815cIxvma#title-pqt-085-dyf

1、application.properties属性文件以及配置nginx反向代理(jar包以及依赖同上,如果没用到nginx可以不用配置) #服务端口 server.port=8003 #服务名 spring.application.name=service-vod # 环境设置:dev、test、prod spring.profiles.active=dev #阿里云 vod #不同的服务器,地址不同 aliyun.vod.file.keyid=ddddddQWzbRYStXv aliyun.vod.file.keysecret=xxxxxxxx9GRqdWDns17gc6i # 最大上传单个文件大小:默认1M spring.servlet.multipart.max-file-size=1024MB # 最大置总上传的数据大小 :默认10M spring.servlet.multipart.max-request-size=1024MB

ConstantVodUtils属性文件值获取

package com.stu.vod.utils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; //项目启动,spring接口,spring加载之后,执行接口一个方法 @Component public class ConstantVodUtils implements InitializingBean { //通过@value注解读取属性文件里的值,赋值给keyId @Value("${aliyun.vod.file.keyid}") private String keyId; @Value("${aliyun.vod.file.keysecret}") private String keysecret; //定义一些静态常量 public static String KEY_ID; public static String KEY_SECRET; //上边赋值完成后,会执行afterPropertiesSet方法,这是spring机制 @Override public void afterPropertiesSet() throws Exception { KEY_ID = keyId; KEY_SECRET = keysecret; } }

ConstantVodUtils属性文件值获取的扩展

package com.stu.service.vod.utils; import lombok.Data; import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /****************************** * 用途说明:视频点播常量 * 作者姓名: Administrator * 创建时间: 2022-06-07 21:48 ******************************/ @Data @Component @ConfigurationProperties(prefix = "aliyun.vod") public class ConstantVodIInit implements InitializingBean { private String keyId; private String keySecret; //定义静态常量 public static String KEY_ID; public static String KEY_SECRET; private ConstantVodIInit(){} //上边赋值完成后,会执行afterPropertiesSet方法,这是spring机制 @Override public void afterPropertiesSet() throws Exception { KEY_ID = this.keyId; KEY_SECRET = this.keySecret; } }

nginx反向代理(nginx.conf文件配置)

将接口地址加入nginx配置

location ~ / eduvod / { proxy_pass http://localhost:8003; } 配置nginx上传文件大小,否则上传时会有 413 (Request Entity Too Large) 异常 打开nginx主配置文件nginx.conf,找到http{},添加 client_max_body_size 1024m;

重启nginx

nginx -s reload

nginx.exe路径下cmd命令输入【nginx.exe】启动nginx,输入nginx.exe按回车,光标闪烁表示启动成功

输入【nginx -s reload】重启nginx(有时候在Windows环境可能不好用)或者通过 nginx.exe -s stop关闭然后通过nginx.exe启动

 

完整配置

#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; client_max_body_size 1024m; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 81; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} server { listen 9001; server_name localhost; location ~ /eduservice/ { proxy_pass http://localhost:8001; } location ~ /eduOss/ { proxy_pass http://localhost:8002; } location ~ /eduvod/ { proxy_pass http://localhost:8003; } } } 2、controller文件 package com.stu.vod.controller; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthRequest; import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse; import com.stu.commonutils.ResultData; import com.stu.servicebase.exceptionHandler.GuliException; import com.stu.vod.service.VodService; import com.stu.vod.utils.ConstantVodUtils; import com.stu.vod.utils.InitVodClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; @RestController @RequestMapping("/eduvod/video") //@CrossOrigin public class VodController { @Autowired private VodService vodService; //上传视频到阿里云 @PostMapping("uploadAlyVideo") public ResultData uploadAlyVideo(MultipartFile file){ //返回视频id String videoId = vodService.uploadAlyVideo(file); return ResultData.success().data("videoId",videoId); } //根据id删除阿里云视频 @DeleteMapping("removeVideo/{id}") public ResultData removeVideo(@PathVariable String id){ //返回视频id String videoId = vodService.removeVideo(id); return ResultData.success(); } //根据id批量删除阿里云视频 @DeleteMapping("removeVideoBatch") public ResultData removeVideoBatch(@RequestParam("videoIdList") List videoIdList){ //返回视频id vodService.removeVideoBatch(videoIdList); return ResultData.success(); } //根据视频id获取视频的播放凭证 @GetMapping("getAlyVideoAuth/{id}") public ResultData getAlyVideoAuth(@PathVariable String id){ try { //1.1创建初始化对象 //创建初始化对象 DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.KEY_ID,ConstantVodUtils.KEY_SECRET); //1.2创建获取视频地址response和request对象 GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest(); GetVideoPlayAuthResponse response = new GetVideoPlayAuthResponse(); //1.3向request对象里面设置视频id request.setVideoId(id); //1.4调用初始化对象里的方法,取得凭证 response = client.getAcsResponse(request); String playAuth = response.getPlayAuth(); return ResultData.success().data("playAuth",playAuth); } catch (ClientException e) { throw new GuliException(20001,"获取凭证失败"); } } }

 

3、service接口 package com.stu.vod.service; import org.springframework.web.multipart.MultipartFile; import java.util.List; public interface VodService { String uploadAlyVideo(MultipartFile file); String removeVideo(String id); void removeVideoBatch(List videoIdList); } 4、service接口实现类 package com.stu.vod.service.impl; import com.aliyun.vod.upload.impl.UploadVideoImpl; import com.aliyun.vod.upload.req.UploadStreamRequest; import com.aliyun.vod.upload.resp.UploadStreamResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.vod.model.v20170321.DeleteVideoRequest; import com.stu.servicebase.exceptionHandler.GuliException; import com.stu.vod.service.VodService; import com.stu.vod.utils.ConstantVodUtils; import com.stu.vod.utils.InitVodClient; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.util.List; import java.util.stream.Collectors; @Service public class VodServiceImpl implements VodService { @Override public String uploadAlyVideo(MultipartFile file) { try { //accessKeyId, accessKeySecret //fileName:上传文件原始名称 // 01.03.09.mp4 String fileName = file.getOriginalFilename(); //title:上传之后显示名称 String title = fileName.substring(0, fileName.lastIndexOf(".")); //inputStream:上传文件输入流 InputStream inputStream = file.getInputStream(); UploadStreamRequest request = new UploadStreamRequest(ConstantVodUtils.KEY_ID,ConstantVodUtils.KEY_SECRET, title, fileName, inputStream); UploadVideoImpl uploader = new UploadVideoImpl(); UploadStreamResponse response = uploader.uploadStream(request); String videoId = null; if (response.isSuccess()) { videoId = response.getVideoId(); } else { //如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 videoId = response.getVideoId(); } return videoId; }catch(Exception e) { e.printStackTrace(); return null; } } @Override public String removeVideo(String id) { try { //1初始化对象 DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.KEY_ID, ConstantVodUtils.KEY_SECRET); //2创建删除视频request对象 DeleteVideoRequest request = new DeleteVideoRequest(); //3向request设置视频id request.setVideoIds(id); //4调用初始化对象的方法删除视频 client.getAcsResponse(request); return id; } catch (Exception e) { e.printStackTrace(); throw new GuliException(20001,"删除视频失败"); } } @Override public void removeVideoBatch(List videoIdList) { try { /*//方式1Java 8使用String.join()函数 String str1 = String.join(",", videoIdList); System.out.println("str1 =" +str1); //方式2 使用org.apache.commons.lang.StringUtils.join String str2 = org.apache.commons.lang.StringUtils.join(videoIdList.toArray(), ","); System.out.println("str2="+str2);*/ //将集合转换为分割的字符串,比如A,B,C,D,E格式 String idsStr = String.join(",", videoIdList.stream().distinct().collect(Collectors.toList())); //1初始化对象 DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.KEY_ID, ConstantVodUtils.KEY_SECRET); //2创建删除视频request对象 DeleteVideoRequest request = new DeleteVideoRequest(); //3向request设置视频id request.setVideoIds(idsStr); //4调用初始化对象的方法删除视频 client.getAcsResponse(request); } catch (Exception e) { e.printStackTrace(); throw new GuliException(20001,"删除视频失败"); } } }

service扩展

package com.stu.service.vod.service.impl; import com.aliyun.vod.upload.impl.UploadVideoImpl; import com.aliyun.vod.upload.req.UploadStreamRequest; import com.aliyun.vod.upload.resp.UploadStreamResponse; import com.stu.service.base.exception.CustomException; import com.stu.service.base.result.ResultCodeEnum; import com.stu.service.vod.service.VodService; import com.stu.service.vod.utils.ConstantVodIInit; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; /****************************** * 用途说明: * 作者姓名: Administrator * 创建时间: 2022-06-07 22:01 ******************************/ @Service @Slf4j public class VodServiceImpl implements VodService { /*********************************** * 用途说明:视频点播 * @param file * 返回值说明: * @return java.lang.String ***********************************/ @Override public String uploadVideo(MultipartFile file) { final String keyId = ConstantVodIInit.KEY_ID; final String keySecret = ConstantVodIInit.KEY_SECRET; try { //文件的原始名称 test.mp4 String originalFileName = file.getOriginalFilename(); //inputStream:上传文件输入流 InputStream inputStream = file.getInputStream(); //文件的标题 test String title = originalFileName.substring(0, originalFileName.lastIndexOf(".")); UploadStreamRequest request = new UploadStreamRequest(keyId, keySecret, title, originalFileName, inputStream); UploadVideoImpl uploader = new UploadVideoImpl(); UploadStreamResponse response = uploader.uploadStream(request); String videoId = response.getVideoId(); //请求视频点播服务的请求ID if (StringUtils.isEmpty(videoId)) { log.error("视频上传失败: " + response.getMessage() + "-" + response.getMessage()); throw new CustomException(ResultCodeEnum.VIDEO_UPLOAD_ALIYUN_ERROR); } return videoId; } catch (IOException e) { e.printStackTrace(); log.error("视频上传失败: " + e.getMessage()); } return null; } }

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3